教程|让水滴逃脱地心引力,往上飞
2020年的开局并不轻松,发生了很多不尽人意的事情。微博#你希望重启2020吗?#冲上热搜,一条208万点赞的微博投票里,141万人希望可以时光倒流,重启2020。
但是,无论是2020,还是我们的人生,时间如洪流,推着人往前,没有暂停键可按,也没有所谓的时光倒流。我们能做的只有好好努力,珍惜当下,觉得压力大的时候,那就看看这“摆脱“地心引力的小水滴,看它肆无忌惮的往上飞,从中找到继续前行的动力吧!
今天给大家分享的项目,来自小小铭Makerming。这个项目的灵感来自于视觉暂留现象,有声电影每秒24格画面,在人脑中即可形成连贯的影像,称之为“视觉暂留现象”,作品通过高速闪动的LED灯光源,照亮不断下滴的水滴,应用人的视错觉,通过调整LED灯的频率和水泵的频率,当两者相互配合达到一个精妙的频率差时,人眼就会产生水滴往上的视错觉。
戳视频领略“反重力”,柴火B站敬请关注
酷不酷?想不想自己也挑战下重力,做出可以往上飞的水滴效果?教程在此,不谢!
教程难度:高手级
项目时长:>2天
软件工具
Arduino IDE
设备工具
激光切割机
热熔胶枪
电烙铁
硬件清单
Seeeduino Lotus主控 V1.1 X1
Grove - MOSFET X2
Grove 旋转角度传感器 X2
Grove开关(可切换高低电平) X1
蠕动泵X1
水管 X 1M
5050 LED灯条 X 1.2M
12V电源
DC母头电源座 X2
DC转换线(1母头转2公头) X1
跳线
5mm亚克力板
亚克力胶
扫码一键买齐所有开源硬件物料
步骤1:设计&激光切割外壳
为了方便测试,外壳的背面和顶盖先不要封死,水管和灯带装好后可只留出顶盖,方便随时开放调试。文末点击阅读原文下载项目结构件设计dxf原文件。
步骤2:硬件连接
步骤3:硬件组装
步骤4:编程与程序烧录
#include <PWM.h> // PWM Frequency library available at https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads
const byte SValve = 5; // 水泵 D5
const byte LED_strip = 3; // 灯带 D3
const byte Mode = A0; // Switch开关调模式 A0 HIGH为标准模式 LOW为调校模式
const byte frequency_sValve_GET = A2; //电位计调水泵频率 A2
const byte frequency_led_GET = A6; //电位计调灯带频率 A6
float BASE_FREQ = 48 ; //基准频率
float frequency_offset = 0.2; //频率差
float duty_sValve = 2; //水泵占空比
float frequency_sValve = BASE_FREQ; // 水泵频率设置为基准频率
float duty_led = 7; // 灯带占空比 调亮度
float frequency_led = frequency_sValve+frequency_offset; //灯带频率设置为基准频率加频率差
//**********************************************************************************************************************************************************
void setup()
{
Serial.begin(9600);
//initialize all timers except for 0, to save time keeping functions
InitTimersSafe();
//sets the frequency for the specified pin
bool success = SetPinFrequencySafe(LED_strip, frequency_led);
bool success2 = SetPinFrequencySafe(SValve, frequency_sValve);
if(success and success2)
Serial.print("init pwm successfully");
}
//**********************************************************************************************************************************************************
void loop()
{
if (!digitalRead(Mode)) {
Serial.print("调试模式已启动");
Serial.print("\n");
float duty_led = 7;//7 灯带占空比 调亮度
Serial.print("灯带占空比 = ");
Serial.print(duty_led);
Serial.print("\n");
float frequency_sValve = map(analogRead(frequency_sValve_GET),0,1023,20,60); // 水泵频率设置为基准频率
Serial.print("水泵频率 = ");
Serial.print(frequency_sValve);
Serial.print("\n");
float frequency_led = map(analogRead(frequency_led_GET),0,1023,20,60); //灯带频率设置为基准频率加频率差
Serial.print("灯带频率 = ");
Serial.print(frequency_led);
Serial.print("\n");
Serial.print("灯带水泵频率差 = ");
Serial.print(frequency_led-frequency_sValve);
Serial.print("\n");
Serial.print("\n");
// Open the waterPump with speices frequency and duty
SetPinFrequencySafe(SValve, frequency_sValve);
sValve_on();
// Open the LED_strip with speices frequency and duty
SetPinFrequencySafe(LED_strip, frequency_led);
pwmWrite(LED_strip, round(duty_led*255/100));
}
else
{
Serial.print("标准模式已启动");
Serial.print("\n");
//float BASE_FREQ = 45;
Serial.print("基准频率 = ");
Serial.print(BASE_FREQ);
Serial.print("\n");
//float frequency_offset = 0.4;
Serial.print("频率差 = ");
Serial.print(frequency_offset);
Serial.print("\n");
float duty_led = 7;//7 灯带占空比 调亮度
Serial.print("灯带占空比 = ");
Serial.print(duty_led);
Serial.print("\n");
float frequency_sValve = BASE_FREQ; // 水泵频率设置为基准频率
Serial.print("水泵频率 = ");
Serial.print(frequency_sValve);
Serial.print("\n");
float frequency_led = frequency_sValve+frequency_offset; //灯带频率设置为基准频率加频率差
Serial.print("灯带频率 = ");
Serial.print(frequency_led);
Serial.print("\n");
Serial.print("\n");
// Open the waterPump with speices frequency and duty
SetPinFrequencySafe(SValve, frequency_sValve);
sValve_on();
// Open the LED_strip with speices frequency and duty
SetPinFrequencySafe(LED_strip, frequency_led);
pwmWrite(LED_strip, round(duty_led*255/100));
}
}
//**********************************************************************************************************************************************************
void sValve_on()
{
pwmWrite(SValve, 255);
}
//**********************************************************************************************************************************************************
void sValve_off()
{
pwmWrite(SValve, 0);
}
步骤5:测试
如果追求一个完美的作品,调试是最花时间的步骤,有点耐心,好好调试到你满意的效果,之后就好好享受反重力水滴带来的乐趣吧。
文末点击阅读原文可以前往该教程英文页面
🤖️🤖️🤖️
文末互动话题
上面这个往上飞的水滴,够溜吗?
留言区见
写在最后-文末小广告
接下来,柴火将基于开源硬件套件(包含部分上诉项目所用的技术模块)定期开设课程,该课程将涉及(但不限于)以下节点:硬件基础原理;传感器应用;基本结构搭建;软件编程与硬件结合;原型搭建;创客马拉松等。
如果你也想玩转开源硬件,
用科技赋能创新落地,
欢迎扫码填写课程意向报名哟!
----END----
Chaihuo x.factory|深圳,河北